home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -screenplay- / hd_installers / -whdload- / whdload_dev / src / sources / devices.i < prev    next >
Text File  |  2000-02-28  |  6KB  |  272 lines

  1.  IFND    DEVICES_I
  2. DEVICES_I = 1
  3. ;*---------------------------------------------------------------------------
  4. ;  :Author.    Bert Jahn
  5. ;  :Contens.    macros for processing devices
  6. ;  :EMail.    wepl@kagi.com
  7. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  8. ;  :Version.    $Id: devices.i 1.2 1998/12/06 13:40:53 jah Exp $
  9. ;  :History.    29.12.95 separated from WRip.asm
  10. ;        18.01.96 IFD Label replaced by IFD Symbol
  11. ;             because Barfly optimize problems
  12. ;  :Copyright.    © 1995,1996,1997,1998 Bert Jahn, All Rights Reserved
  13. ;  :Language.    68000 Assembler
  14. ;  :Translator.    Barfly V1.130
  15. ;---------------------------------------------------------------------------*
  16. *##
  17. *##    devices.i
  18. *##
  19. *##    _GetDeviceInfo        devicename(a0) infostruct(a1) -> success(d0)
  20. *##    _deviceerrors        device error strings
  21. *##    _trackdiskerrors    trackdisk.device error strings
  22.  
  23.     dc.b    "$Id: devices.i 1.2 1998/12/06 13:40:53 jah Exp $"
  24.     EVEN
  25.  
  26.         IFND    DOS_DOSEXTENS_I
  27.             INCLUDE    dos/dosextens.i
  28.         ENDC
  29.         IFND    DOS_FILEHANDLER_I
  30.             INCLUDE    dos/filehandler.i
  31.         ENDC
  32.         IFND    STRINGS_I
  33.             INCLUDE    strings.i
  34.         ENDC
  35.         IFND    _LVOLockDosList
  36.             INCLUDE lvo/dos.i
  37.         ENDC
  38.  
  39. ;----------------------------------------
  40. ; Besorgt Infos über Device
  41. ; references: The Amiga Guru Book, Ralph Babel
  42. ;        S.618f  ACTION_GET_DISK_FSSM
  43. ;        S.551ff DosList structure
  44. ;        S.353ff DOS-internals and programming aspects
  45. ; Übergabe :    A0 = CPTR name of device without ":" (e.g. "DF1")
  46. ;        A1 = STRUCT DeviceInfo to fill
  47. ; Rückgabe :    D0 = LONG success
  48. ; Benötigt :    _PrintErrorDOS    (a0 = CPTR name of error | NIL)
  49. ;        _PrintError    (d0 = CPTR Subsystem | NIL
  50. ;                 a0 = CPTR Art des Fehlers | NIL
  51. ;                 a1 = CPTR bei Operation | NIL)
  52.  
  53. DEVNAMELEN = 64        ;maximal length of the device name
  54.  
  55.     STRUCTURE    DeviceInfo,0
  56.         STRUCT    devi_Device,DEVNAMELEN
  57.         ULONG    devi_Unit
  58.         ULONG    devi_DeviceFlags
  59.         ULONG    devi_SizeBlock        ;in Bytes !
  60.         ULONG    devi_Surfaces
  61.         ULONG    devi_SectorPerBlock
  62.         ULONG    devi_BlocksPerTrack
  63.         ULONG    devi_LowCyl
  64.         ULONG    devi_HighCyl
  65.         LABEL    devi_SIZEOF
  66.  
  67. GetDeviceInfo    MACRO
  68.     IFND    GETDEVICEINFO
  69. GETDEVICEINFO = 1
  70.     IFND    COPYSTRING
  71.         CopyString
  72.     ENDC
  73.  
  74. DOSLISTFLAGS =    LDF_READ!LDF_DEVICES        ;flags for LockDosList,FindDosEntry,UnLockDosList
  75.  
  76. _GetDeviceInfo    movem.l    d2-d7/a2/a6,-(a7)
  77.         move.l    a0,d2                ;D2 = DevName
  78.         move.l    a1,a2                ;A2 = STRUCT DeviceInfo
  79.         moveq    #-1,d7                ;D7 = ReturnCode (bool)
  80.         
  81.         moveq    #DOSLISTFLAGS,d1
  82.         move.l    (gl_dosbase,GL),a6
  83.         jsr    (_LVOLockDosList,a6)
  84.         move.l    d0,d1                ;D1 = doslist
  85.         bne    .dlok
  86.         lea    (_getdevinfo),a0
  87.         bsr    _PrintErrorDOS
  88.         moveq    #0,d7
  89.         bra    .nodl
  90. .dlok                            ;D2 = name
  91.         moveq    #DOSLISTFLAGS,d3
  92.         jsr    (_LVOFindDosEntry,a6)
  93.         tst.l    d0
  94.         bne    .dlfound
  95.         moveq    #0,d0
  96.         lea    (_nodev),a0
  97.         lea    (_getdevinfo),a1
  98.         bsr    _PrintError
  99.         moveq    #0,d7
  100.         bra    .unlockdl
  101. .dlfound
  102.         move.l    d0,a0                ;A0 = APTR DosList
  103.         tst.l    (dol_Task,a0)
  104.         beq    .notask
  105.         move.l    (dol_Startup,a0),d0
  106.         cmp.l    #64,d0                ; $00000040 < d6 < $80000000 ?? BPTR!
  107.         blt    .badstartup
  108.         add.l    d0,d0
  109.         add.l    d0,d0
  110.         beq    .nostartup
  111.         move.l    d0,a0                ;A0 = APTR FileSystemStartupMessage
  112.  
  113.         tst.l    (fssm_Device,a0)
  114.         beq    .nodevice
  115.         move.l    a0,-(a7)
  116.         move.l    (fssm_Device,a0),a0        ;a BSTR !!!
  117.         add.l    a0,a0
  118.         add.l    a0,a0                ;now it's a APTR
  119.         moveq    #0,d0
  120.         move.b    (a0)+,d0
  121.         addq.l    #1,d0                ;d0 size of needed space (length+1)
  122.         moveq    #DEVNAMELEN,d1
  123.         cmp.l    d0,d1                ;buffer large enough ?
  124.         bhs    .sizeok
  125.         addq.l    #4,a7                ;correct stack
  126.         bra    .copyerr
  127. .sizeok        lea    (devi_Device,a2),a1
  128.         bsr    _CopyString
  129.         move.l    (a7)+,a0
  130.  
  131.         move.l    (fssm_Unit,a0),(devi_Unit,a2)
  132.         move.l    (fssm_Flags,a0),(devi_DeviceFlags,a2)
  133.         move.l    (fssm_Environ,a0),d0
  134.         add.l    d0,d0
  135.         add.l    d0,d0
  136.         beq    .noenvec
  137.  
  138.         move.l    d0,a0                ;A0 = APTR DosEnvec
  139.         move.l    (de_SizeBlock,a0),d0
  140.         lsl.l    #2,d0                ;size in Bytes
  141.         move.l    d0,(devi_SizeBlock,a2)
  142.         move.l    (de_Surfaces,a0),(devi_Surfaces,a2)
  143.         move.l    (de_SectorPerBlock,a0),(devi_SectorPerBlock,a2)
  144.         move.l    (de_BlocksPerTrack,a0),(devi_BlocksPerTrack,a2)
  145.         move.l    (de_LowCyl,a0),(devi_LowCyl,a2)
  146.         move.l    (de_HighCyl,a0),(devi_HighCyl,a2)
  147.         bra    .unlockdl
  148. .notask
  149. .badstartup
  150. .nostartup
  151. .nodevice
  152. .copyerr
  153. .noenvec    moveq    #0,d0
  154.         lea    (_baddev),a0
  155.         lea    (_getdevinfo),a1
  156.         bsr    _PrintError
  157.         moveq    #0,d7
  158. .unlockdl
  159.         moveq    #DOSLISTFLAGS,d1
  160.         jsr    (_LVOUnLockDosList,a6)
  161. .nodl
  162.         move.l    d7,d0
  163.         movem.l    (a7)+,d2-d7/a2/a6
  164.         rts
  165.     ENDC
  166.         ENDM
  167.  
  168. ;----------------------------------------
  169. ; error strings for device operations
  170. ; for using with "Sources:strings.i" _DoString
  171.  
  172. deviceerrors    MACRO
  173.     IFND    DEVICEERRORS
  174. DEVICEERRORS = 1
  175.  
  176. _deviceerrors
  177. .base        dc.w    -7        ;min index
  178.         dc.w    -1        ;max index
  179.         dc.l    0        ;next list
  180.         dc.w    .7-.base
  181.         dc.w    .6-.base
  182.         dc.w    .5-.base
  183.         dc.w    .4-.base
  184.         dc.w    .3-.base
  185.         dc.w    .2-.base
  186.         dc.w    .1-.base
  187. .7        dc.b    "hardware failed selftest",0
  188. .6        dc.b    "unit is busy",0
  189. .5        dc.b    "invalid address (IO_DATA)",0
  190. .4        dc.b    "invalid length (IO_LENGTH/IO_OFFSET)",0
  191. .3        dc.b    "unsupported device CMD",0
  192. .2        dc.b    "AbortIO()",0
  193. .1        dc.b    "open device failed",0
  194.         EVEN
  195.     ENDC
  196.         ENDM
  197.         
  198. ;----------------------------------------
  199. ; error strings for trackdisk.device operations
  200. ; for using with "Sources:strings.i" _DoString
  201.  
  202. trackdiskerrors    MACRO
  203.     IFND    TRACKDISKERRORS
  204. TRACKDISKERRORS = 1
  205.         IFND    DEVICEERRORS
  206.             deviceerrors
  207.         ENDC
  208.  
  209. _trackdiskerrors
  210. .base        dc.w    20
  211.         dc.w    50
  212.         dc.l    _deviceerrors
  213.         dc.w    .20-.base
  214.         dc.w    .21-.base
  215.         dc.w    .22-.base
  216.         dc.w    .23-.base
  217.         dc.w    .24-.base
  218.         dc.w    .25-.base
  219.         dc.w    .26-.base
  220.         dc.w    .27-.base
  221.         dc.w    .28-.base
  222.         dc.w    .29-.base
  223.         dc.w    .30-.base
  224.         dc.w    .31-.base
  225.         dc.w    .32-.base
  226.         dc.w    .33-.base
  227.         dc.w    .34-.base
  228.         dc.w    .35-.base
  229.         dc.w    .36-.base
  230.         dc.w    .37-.base
  231.         dc.w    0
  232.         dc.w    0
  233.         dc.w    0
  234.         dc.w    0
  235.         dc.w    .42-.base
  236.         dc.w    0
  237.         dc.w    0
  238.         dc.w    0
  239.         dc.w    0
  240.         dc.w    0
  241.         dc.w    0
  242.         dc.w    0
  243.         dc.w    .50-.base
  244. .20        dc.b    "not specified",0
  245. .21        dc.b    "no sector header",0
  246. .22        dc.b    "bad sector preamble",0
  247. .23        dc.b    "bad sector id",0
  248. .24        dc.b    "bad header chksum",0
  249. .25        dc.b    "bad sector chksum",0
  250. .26        dc.b    "too few sectors",0
  251. .27        dc.b    "bad sector header",0
  252. .28        dc.b    "write protected",0
  253. .29        dc.b    "no disk in drive",0
  254. .30        dc.b    "couldn't find track 0",0
  255. .31        dc.b    "not enough memory",0
  256. .32        dc.b    "bad unit number",0
  257. .33        dc.b    "bad drive type",0
  258. .34        dc.b    "drive in use",0
  259. .35        dc.b    "post reset",0
  260. .36        dc.b    "data on disk is wrong type",0
  261. .37        dc.b    "invalid CMD under current conditions",0
  262. .42        dc.b    "illegal/unexpected SCSI phase",0
  263. .50        dc.b    "nonexistent board",0
  264.         EVEN
  265.     ENDC
  266.         ENDM
  267.  
  268. ;---------------------------------------------------------------------------
  269.  
  270.     ENDC
  271.  
  272.